/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Classes;


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import AuxClasses.MD5;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Marvin
 */
public class Register extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession actual = request.getSession();
        String dpi = request.getParameter("dpi");
        String correo = request.getParameter("correo");
        String contrasena1 = request.getParameter("contrasena1");
        String contrasena2 = request.getParameter("contrasena2");
        String nombre = request.getParameter("nombre");
        String apellido = request.getParameter("apellido");
        String telefono = request.getParameter("telefono");
        String direccion = request.getParameter("direccion");
        String num_tarjeta_credito = request.getParameter("num_tarjeta_credito");
        String nombre_tarjeta = request.getParameter("nombre_tarjeta");
        String emisor = request.getParameter("emisor");
        String csv = request.getParameter("csv");
        String direccion_f = request.getParameter("direccion_f");
        String fecha_vencimiento = request.getParameter("fecha_vencimiento");
        
        Connection conn = null;
        Statement s = null;
        Statement s2 = null;
        ResultSet rs = null;
        ResultSet rs2 = null;
        String userName = "root";
        String password = "1234";
        String url = "jdbc:mysql://localhost/bancofarmville";
        String error = null;
        try
        {
            Class.forName ("com.mysql.jdbc.Driver").newInstance ();
            conn = DriverManager.getConnection (url, userName, password);
            System.out.println ("Database connection established");
            s = conn.createStatement ();
            s2 = conn.createStatement ();
            Pattern p_dpi = Pattern.compile("\\d{1}\\d{1}\\d{1}\\d+");
            Matcher m_dpi = p_dpi.matcher(dpi);
            Pattern p_tel = Pattern.compile("\\d{8}");
            Matcher m_tel = p_tel.matcher(telefono);
            Pattern p_tar = Pattern.compile("\\d{16}");
            Matcher m_tar = p_tar.matcher(num_tarjeta_credito);
            Pattern p_csv = Pattern.compile("\\d{3}");
            Matcher m_csv = p_csv.matcher(csv);
            Pattern p_fec = Pattern.compile("\\d{2}-\\d{2}");
            Matcher m_fec = p_fec.matcher(fecha_vencimiento);
            
            if (correo.equals("")||contrasena1.equals("")||contrasena2.equals("")||nombre.equals("")||apellido.equals("")||telefono.equals("")||direccion.equals(""))
            {
                error = "<p style=\"color:red\">(*) Error: Todos los campos personales son obligatorios</p>";
                actual.setAttribute("error_correo", error);
                response.sendRedirect("register.jsp");
            }
            else if (num_tarjeta_credito.equals("")|| nombre_tarjeta.equals("")||emisor.equals("")||csv.equals("")||fecha_vencimiento.equals("")||direccion_f.equals(""))
            {
                error = "<p style=\"color:red\">(*) Error: Todos los campos de credito son obligatorios</p>";
                actual.setAttribute("error_correo", error);
                response.sendRedirect("register.jsp");
            }
            else if (correo.equals("")||contrasena1.equals("")||contrasena2.equals("")||nombre.equals("")||apellido.equals("")||telefono.equals("")||direccion.equals(""))
            {
                error = "<p style=\"color:red\">(*) Error: Todos los campos son obligatorios</p>";
                actual.setAttribute("error_correo", error);
                response.sendRedirect("register.jsp");
            }
            else if (!m_dpi.matches())
            {
                error = "<p style=\"color:red\">(*) Error: El DPI debe de ser numerico y tener al menos 4 digitos</p>";
                actual.setAttribute("error_correo", error);
                response.sendRedirect("register.jsp");
            }
            else if (!m_tel.matches())
            {
                error = "<p style=\"color:red\">(*) Error: El telefono debe de ser numerico y tener 8 digitos</p>";
                actual.setAttribute("error_correo", error);
                response.sendRedirect("register.jsp");   
            }
            else if (!m_tar.matches())
            {
                error = "<p style=\"color:red\">(*) Error: El numero de la tarjeta ingresado debe ser numerico y tener 16 digitos</p>";
                actual.setAttribute("error_correo", error);
                response.sendRedirect("register.jsp");   
            }
            else if (!m_csv.matches())
            {
                error = "<p style=\"color:red\">(*) Error: El numero de CSV ingresado debe ser numerico y tener 3 digitos</p>";
                actual.setAttribute("error_correo", error);
                response.sendRedirect("register.jsp");   
            }
            else if (!m_fec.matches())
            {
                error = "<p style=\"color:red\">(*) Error: La fecha de vencimiento no se ha ingresado en formato AA-MM (Ej. 11-06)</p>";
                actual.setAttribute("error_correo", error);
                response.sendRedirect("register.jsp");   
            }
            else
            {
                s.executeQuery("SELECT * FROM usuario WHERE correo_electronico=\""+correo+"\" OR DPI=\""+dpi+"\"");
                rs = s.getResultSet();
                s2.executeQuery("SELECT * FROM tarjetacredito WHERE num_tarjeta_credito=\""+num_tarjeta_credito+"\"");
                rs2 = s2.getResultSet();
                if (rs.next())
                {
                    error = "<p style=\"color:red\">(*) Ya existe un usuario registrado con este correo electronico y/o DPI</p>";
                    actual.setAttribute("error_correo", error);
                    response.sendRedirect("register.jsp");   
                }
                else if (rs2.next())
                {
                    error = "<p style=\"color:red\">(*) La tarjeta de credito ya se encuentra registrada en el sistema</p>";
                    actual.setAttribute("error_correo", error);
                    response.sendRedirect("register.jsp");   
                }
                else if (contrasena1.equals(contrasena2))
                {
                    /* INSERT INTO  `bancofarmville`.`usuario` (`DPI`, `nombre`, `apellido`, `password`, `telefono`, `direccion`, `estado`, `monto`, `correo_electronico`) 
                     * VALUES ('4569', 'Richard', 'Stallmanu', '81dc9bdb52d04dc20036dbd8313ed055', '66666666', 'GNU Mad', 'Vigente', '0.00', 'stallmanu@gnu.org');
                    
                     (\"DPI\", \"nombre\", \"apellido\", \"password\", \"telefono\", \"direccion\", \"estado\", \"monto\", \"correo_electronico\")
                     */
                    
                    MD5 md5 = new MD5();
                    String hash = md5.getMD5(contrasena1);
                    System.out.println (hash);
                    String query = "INSERT INTO `bancofarmville`.`usuario` (`DPI`, `nombre`, `apellido`, `password`, `telefono`, `direccion`, `estado`, `monto`, `correo_electronico`)";
                    query = query + " VALUES (" ;
                    query = query + "\""+dpi+"\",";
                    query = query + "\""+nombre+"\",";
                    query = query + "\""+apellido+"\",";
                    query = query + "\""+hash+"\",";
                    query = query + "\""+telefono+"\",";
                    query = query + "\""+direccion+"\",";
                    query = query + "\"Vigente\",";
                    query = query + "\"0.00\",";
                    query = query + "\""+correo+"\");";
                    s.execute(query);
                    
                    fecha_vencimiento = "20"+fecha_vencimiento+"-01";
                    query = "INSERT INTO `bancofarmville`.`tarjetacredito` (`num_tarjeta_credito`, `csv`, `fecha_vencimiento`, `emisor`, `nombre_tarjeta`, `direccion_facturacion`, `Usuario_DPI`) ";
                    query = query + " VALUES (" ;
                    query = query + "\""+num_tarjeta_credito+"\",";
                    query = query + "\""+csv+"\",";
                    query = query + "\""+fecha_vencimiento+"\",";
                    query = query + "\""+emisor+"\",";
                    query = query + "\""+nombre_tarjeta+"\",";
                    query = query + "\""+direccion_f+"\",";
                    query = query + "\""+dpi+"\");";
                    s.execute(query);
                    
                    actual.setAttribute("error_correo", null);
                    actual.setAttribute("user", nombre+" "+apellido);
                    actual.setAttribute("correo",correo);
                    response.sendRedirect("index.jsp");
                }
                else
                {
                    error = "<p style=\"color:red\">(*) Error: La contraseña ingresada no coincide</p>";
                    actual.setAttribute("error_correo", error);
                    response.sendRedirect("register.jsp");
                }
            }
        }
        catch (Exception e)
        {
           System.err.println ("No se pudo conectar a la base de datos " + e.getMessage());
        }
        finally
        {
           if (conn != null)
           {
               try
               {
                   conn.close ();
                   System.out.println ("Conexión Finalizada");
               }
               catch (Exception e) { }
           }
        }
        
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
